# 日志封装（输出运行日志、错误日志等）
import logging  # 导入Python标准日志模块
import os  # 导入操作系统接口模块（虽然代码中未直接使用）
from pathlib import Path  # 导入面向对象的文件系统路径模块
from datetime import datetime  # 导入日期时间处理模块

class logger:
    """日志管理类"""
    
    def __init__(self, name="pytest_sql_api", level=logging.INFO):
        # 初始化方法，默认日志器名为"pytest_sql_api"，默认级别为INFO
        self.logger = logging.getLogger(name)  # 获取指定名称的日志器
        self.logger.setLevel(level)  # 设置日志记录级别
        
        # 避免重复添加handler（防止多次初始化时重复添加处理器）
        if not self.logger.handlers:
            self._setup_handlers()  # 如果无处理器则进行设置
    
    def _setup_handlers(self):
        """设置日志处理器（控制台+文件）"""
        # 创建日志目录
        log_dir = Path("logs")  # 创建Path对象指向logs目录
        log_dir.mkdir(exist_ok=True)  # 创建目录（存在时不报错）
        
        # 控制台处理器配置
        console_handler = logging.StreamHandler()  # 创建控制台输出处理器
        console_handler.setLevel(logging.INFO)  # 设置控制台日志级别
        console_formatter = logging.Formatter(
            '%(asctime)s [%(levelname)s] %(name)s: %(message)s',  # 格式：时间+级别+名称+消息
            datefmt='%Y-%m-%d %H:%M:%S'  # 时间格式化为"年-月-日 时:分:秒"
        )
        console_handler.setFormatter(console_formatter)  # 应用格式器
        self.logger.addHandler(console_handler)  # 添加到日志器
        
        # 文件处理器配置
        log_file = log_dir / f"test_{datetime.now().strftime('%Y%m%d')}.log"  # 生成带日期的日志文件名
        file_handler = logging.FileHandler(log_file, encoding='utf-8')  # 创建UTF-8编码的文件处理器
        file_handler.setLevel(logging.DEBUG)  # 文件记录更详细的DEBUG级别
        file_formatter = logging.Formatter(
            '%(asctime)s [%(levelname)s] %(name)s:%(lineno)d: %(message)s',  # 比控制台多记录行号
            datefmt='%Y-%m-%d %H:%M:%S'
        )
        file_handler.setFormatter(file_formatter)  # 应用格式器
        self.logger.addHandler(file_handler)  # 添加到日志器
    
    # 以下是各级别日志记录方法
    def debug(self, message):
        """记录DEBUG级别日志（最详细，通常用于调试）"""
        self.logger.debug(message)
    
    def info(self, message):
        """记录INFO级别日志（常规信息）"""
        self.logger.info(message)
    
    def warning(self, message):
        """记录WARNING级别日志（潜在问题）"""
        self.logger.warning(message)
    
    def error(self, message):
        """记录ERROR级别日志（严重错误）"""
        self.logger.error(message)
    
    def critical(self, message):
        """记录CRITICAL级别日志（致命错误）"""
        self.logger.critical(message)
    
    # 以下是业务场景专用方法
    def log_test_start(self, test_name):
        """记录测试用例开始执行"""
        self.info(f"开始执行测试: {test_name}")  # 使用INFO级别
    
    def log_test_end(self, test_name, status="PASS"):
        """记录测试用例结束（默认状态为PASS）"""
        self.info(f"测试结束: {test_name} - {status}")
    
    def log_api_request(self, method, url, headers=None, data=None):
        """记录API请求（方法+URL+请求头），敏感数据建议加密后记录"""
        self.info(f"API请求: {method} {url}")
        if headers:
            self.debug(f"请求头: {headers}")
        if data:  # 详细请求数据用DEBUG级别记录
            self.debug(f"请求数据: {data}")
    
    def log_api_response(self, status_code, response_data=None):
        """记录API响应状态码，大响应体建议采样记录"""
        self.info(f"API响应: {status_code}")
        if response_data:
            self.debug(f"响应数据: {response_data}")
    
    def log_db_operation(self, operation, table, sql=None):
        """记录数据库操作（表级别），敏感SQL建议脱敏"""
        self.info(f"数据库操作: {operation} {table}")
        if sql:
            self.debug(f"SQL: {sql}")
    
    def log_error_with_context(self, error, context=""):
        """记录错误及其上下文（便于排查）"""
        self.error(f"错误: {error}")  # 主错误信息
        if context:
            self.error(f"上下文: {context}")  # 补充上下文

# 单例模式：创建默认日志实例
default_logger = logger()  # 实例化默认日志器（全局可用）

def get_logger(name=None):
    """获取日志器实例的工厂方法
    Args:
        name: 可选，指定日志器名称（用于区分不同模块日志）
    Returns:
        返回指定名称的日志器实例，未指定时返回默认实例
    """
    if name:
        return logger(name)  # 创建具名日志器
    return default_logger  # 返回默认日志器
    